#pragma once

#include"Protocol.hpp"
#include"Logger.hpp"
#include <iostream>
#include <string>
#include<functional>

using handler_t =std::function<Responce( Request&)>;


class Parser
{
public:
    Parser(handler_t handler):_handler(handler)
    {}
    std::string Parse(std::string &inbuffer)
    {
        LOG(LogLevel::DEBUG) << "解析：" << inbuffer;

        std::string send_str;

        while (true)//inbuffer 中可能存在多个报文，所以加上while
        {
            // 获取数据成功，处理数据、做返回
            // 传进去请求，传回来应答 --> 协议
            std::string jsonstr;
            // 先将inbuffer解包、反序列化放入req 中
            int n = Protocol::Unpack(inbuffer, &jsonstr);//Unpack 会对inbuffer 调整
            if (n == 0) break;
            else if (n == -1)
                exit(0);
            else
            {
                Request req;
                // 获取到了完整的json串,反序列化需要判断反序列化是否成功
                if(!req.UnSerialize(jsonstr))
                {
                    return std::string();//这一个报文出错了，解决下一个
                }
                // 处理请求并返回应答
                Responce resp = _handler(req);

                // 将应答序列化
                std::string resp_json;
                //判断序列化是否成功
                if(!resp.Serialize(&resp_json))
                {
                    return std::string();//这一个报文出错了，解决下一个
                }
                send_str += Protocol::Package(resp_json);
            }
        }
        return send_str;
    }

private:
    handler_t _handler;
};